package br.com.caelum.controller;

import br.com.caelum.dao.ProdutoDao;
import br.com.caelum.dao.UsuarioDao;
import br.com.caelum.model.Produto;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Resource;
import br.com.caelum.vraptor.Result;
import br.com.caelum.vraptor.Validator;
import br.com.caelum.vraptor.serialization.JSONPSerialization;
import br.com.caelum.vraptor.validator.ValidationMessage;
import java.util.List;

@Resource
public class ProdutoController {

    private ProdutoDao dao;
    private Result result;
    private Validator validator;

    public ProdutoController(ProdutoDao dao, Result result, Validator validator) {
        this.dao = dao;
        this.result = result;
        this.validator = validator;
    }
    
    public List<Produto> busca(String nome){
        //result faz com que inclua essa variavel "nome" na busca.jsp junto com o retorno do método
        result.include("nome", nome);
        return dao.buscarPorNome(nome);
    }

    public List<Produto> lista() {
        return dao.listarTodos();
    }

    public void adiciona(Produto produto) {
        validar(produto, "adiciona");
        dao.salvar(produto);
        result.redirectTo(this).lista();
    }

    //método que faz a busca de qual produto vai editar e joga nos campos da
    //view edita.jsp exatamente o produto para se alterar
    public Produto edita(int id) {
        return dao.buscarPorId(id);
    }

    //método que altera um produto quando se clica no editar no listar produtos
    //utiliza o método de validação para poder alterar
    public void altera(Produto produto) {
        validar(produto, "altera");
        dao.salvar(produto);
        result.redirectTo(this).lista();
    }

    //método que remove um produto da lista de produtos
    public void remove(int id) {
        dao.excluir(dao.buscarPorId(id));
        result.redirectTo(this).lista();
    }

    //método que inicializa o formulário de cadastro de um novo produto
    //ele já chama a view formulario.jsp pelo vRaptor
    @Path ("/produto/novo")
    public void formulario() {
    }

    //método que faz a verifição dos campos para alterar ou cadastrar um novo produto
    public Boolean validar(Produto produto, String operacao) {
        if (produto.getNome() == null || produto.getNome().length() < 3) {
            validator.add(new ValidationMessage(
                    "Nome é obrigatório e precisa ter mais de 3 letras", "produto.nome"));

            if (operacao.equals("adiciona")) {
                validator.onErrorUsePageOf(this).formulario();
            } else {
                validator.onErrorUsePageOf(this).edita(produto.getId());
            }
            return false;
        }
        if ((produto.getPreco() == null) || (produto.getPreco() <= 0.0)) {
            validator.add(new ValidationMessage(
                    "Preço é obrigatório e precisa ser positivo", "produto.preco"));

            if (operacao.equals("adiciona")) {
                validator.onErrorUsePageOf(this).formulario();
            } else {
                validator.onErrorUsePageOf(this).edita(produto.getId());
            }
            return false;
        }
        return true;
    }
}